package cn.csc.module.distribute.dal.mysql.distributor;

import cn.csc.framework.common.pojo.PageResult;
import cn.csc.framework.mybatis.core.mapper.BaseMapperX;
import cn.csc.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.csc.framework.mybatis.core.query.LambdaUpdateWrapperX;
import cn.csc.module.distribute.controller.admin.distributor.vo.DistributorExportReqVO;
import cn.csc.module.distribute.controller.admin.distributor.vo.DistributorPageReqVO;
import cn.csc.module.distribute.controller.app.distributor.vo.AppDistributorReqVO;
import cn.csc.module.distribute.dal.dataobject.distributor.DistributorDO;
import org.apache.ibatis.annotations.Mapper;

import java.math.BigDecimal;
import java.math.BigInteger;
import java.time.LocalDateTime;
import java.util.List;

/**
 * 分销员信息 Mapper
 *
 * @author liuchuang
 */
@Mapper
public interface DistributorMapper extends BaseMapperX<DistributorDO> {

    default PageResult<DistributorDO> selectPage(DistributorPageReqVO reqVO) {
        return selectPage(reqVO, new LambdaQueryWrapperX<DistributorDO>()
                .likeIfPresent(DistributorDO::getName, reqVO.getName())
                .eqIfPresent(DistributorDO::getMobile, reqVO.getMobile())
                .eqIfPresent(DistributorDO::getUserId, reqVO.getUserId())
                .eqIfPresent(DistributorDO::getStatus, reqVO.getStatus())
                .betweenIfPresent(DistributorDO::getCommissionTotal, reqVO.getCommissionTotal())
                .betweenIfPresent(DistributorDO::getCreateTime, reqVO.getCreateTime())
                .orderByDesc(DistributorDO::getCreateTime));
    }

    default List<DistributorDO> selectList(DistributorExportReqVO reqVO) {
        return selectList(new LambdaQueryWrapperX<DistributorDO>()
                .likeIfPresent(DistributorDO::getName, reqVO.getName())
                .eqIfPresent(DistributorDO::getMobile, reqVO.getMobile())
                .eqIfPresent(DistributorDO::getUserId, reqVO.getUserId())
                .eqIfPresent(DistributorDO::getStatus, reqVO.getStatus())
                .betweenIfPresent(DistributorDO::getCommissionTotal, reqVO.getCommissionTotal())
                .betweenIfPresent(DistributorDO::getCreateTime, reqVO.getCreateTime())
                .orderByDesc(DistributorDO::getCreateTime));
    }

    default DistributorDO selectByInviteCode(String inviteCode) {
        return selectOne(new LambdaQueryWrapperX<DistributorDO>()
                .eq(DistributorDO::getInviteCode, inviteCode));
    }

    default DistributorDO selectByUserId(BigInteger userId) {
        return selectOne(new LambdaQueryWrapperX<DistributorDO>()
                .select(DistributorDO::getId,DistributorDO::getUserId,DistributorDO::getAuditTime,DistributorDO::getMobile
                        ,DistributorDO::getDistributeWxCode,DistributorDO::getAvatar,DistributorDO::getStatus)
                .eq(DistributorDO::getUserId, userId));
    }

    /**
     * 通过下线用户ID查询分销员
     */
    DistributorDO selectByChildId(BigInteger childId);

    default Integer updateInviteInfo(DistributorDO distributorDO) {
        LambdaUpdateWrapperX<DistributorDO> updateWrapper = new LambdaUpdateWrapperX<>();
        updateWrapper.set(DistributorDO::getDistributeWxCode, distributorDO.getDistributeWxCode());
        updateWrapper.setIfPresent(DistributorDO::getDistributeShortLink, distributorDO.getDistributeShortLink());
        updateWrapper.eq(DistributorDO::getId, distributorDO.getId());
        return update(null, updateWrapper);
    }

    default DistributorDO getDistributorByUserId(AppDistributorReqVO reqVO) {
        return selectOne(new LambdaQueryWrapperX<DistributorDO>()
                .eq(DistributorDO::getUserId, reqVO.getUserId())
                .eq(DistributorDO::getStatus, reqVO.getStatus()));
    }


    default int updateAuditStatus(BigInteger id, Byte status){
        LambdaUpdateWrapperX<DistributorDO> updateWrapper = new LambdaUpdateWrapperX<>();
        updateWrapper.set(DistributorDO::getStatus, status);
        updateWrapper.set(DistributorDO::getAuditTime, LocalDateTime.now());
        updateWrapper.eq(DistributorDO::getId,id);
        return update(null, updateWrapper);
    }

    /**
     * 下单算待入佣金
     *
     * @param userId
     * @param amount
     * @return
     */
    default int updateDistributorPending(BigInteger userId, BigDecimal amount) {
        LambdaUpdateWrapperX<DistributorDO> updateWrapper = new LambdaUpdateWrapperX();
        updateWrapper.increField(DistributorDO::getCommissionPending, amount);
        updateWrapper.eq(DistributorDO::getUserId, userId);
        return update(null, updateWrapper);
    }

    /**
     * 收货算佣金
     *
     * @param userId
     * @param amount
     * @return
     */
    default int updateTotalAndWithdrawable(BigInteger userId, BigDecimal amount,Integer orderNum) {
        LambdaUpdateWrapperX<DistributorDO> updateWrapper = new LambdaUpdateWrapperX();
        updateWrapper.decreField(DistributorDO::getCommissionPending, amount);
        updateWrapper.increField(DistributorDO::getCommissionWithdrawable, amount);
        updateWrapper.increField(DistributorDO::getCommissionTotal, amount);
        updateWrapper.increField(DistributorDO::getOrderNum, orderNum);
        updateWrapper.eq(DistributorDO::getUserId, userId);
        return update(null, updateWrapper);
    }

    /**
     * 申请提现
     *
     * @param userId
     * @param amount
     * @return
     */
    default int updateWithdrawn(BigInteger userId, BigDecimal amount) {
        LambdaUpdateWrapperX<DistributorDO> updateWrapper = new LambdaUpdateWrapperX();
        //updateWrapper.increField(DistributorDO::getCommissionWithdrawn,amount);
        updateWrapper.decreField(DistributorDO::getCommissionWithdrawable, amount);
        updateWrapper.eq(DistributorDO::getUserId, userId);
        return update(null, updateWrapper);
    }

    /**
     * 已提现金额
     *
     * @param userId
     * @param amount
     * @return
     */
    default int increFieldWithdrawn(BigInteger userId, BigDecimal amount, BigDecimal subAmount) {
        LambdaUpdateWrapperX<DistributorDO> updateWrapper = new LambdaUpdateWrapperX();
        updateWrapper.increField(DistributorDO::getCommissionWithdrawn, amount);
        updateWrapper.increField(DistributorDO::getCommissionWithdrawable, subAmount);
        updateWrapper.eq(DistributorDO::getUserId, userId);
        return update(null, updateWrapper);
    }

    /**
     * 返回提现金额
     *
     * @param userId
     * @param amount
     * @return
     */
    default int increFieldWithdrawable(BigInteger userId, BigDecimal amount) {
        LambdaUpdateWrapperX<DistributorDO> updateWrapper = new LambdaUpdateWrapperX();
        updateWrapper.increField(DistributorDO::getCommissionWithdrawable, amount);
        updateWrapper.eq(DistributorDO::getUserId, userId);
        return update(null, updateWrapper);
    }

    /**
     * 团队人数
     *
     * @param id
     * @param count
     * @return
     */
    default int increFieldTeamNum(BigInteger id, Integer count) {
        LambdaUpdateWrapperX<DistributorDO> updateWrapper = new LambdaUpdateWrapperX();
        updateWrapper.increField(DistributorDO::getTeamNum, count);
        updateWrapper.eq(DistributorDO::getId, id);
        return update(null, updateWrapper);
    }

}
